package com.sxt;

import com.sxt.obj.*;
import com.sxt.utils.GameUtils;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GameWin extends JFrame {
    //游戏状态 0未开始 1游戏中 2暂停 3通关失败 4通关成功
    public static int state=0;
    int width=600;
    int height=600;
    //双缓存的图片
    Image offScreenImage =null;
    //游戏的重绘次数 每次游戏至少会重绘一次
     int count=1;
     //敌机出现的数量
    int enemyCount=0;
    //游戏得分
    public static int score=0;
    //背景图对象 工具类背景图，横坐标0，纵坐标-2000，速度2
    BgObj bgObj=new BgObj(GameUtils.bgImg,0,-2000,2);
    //创建我方飞机对象 然后让飞机调用自身paintself方法
    public PlaneObj planeObj=new PlaneObj(GameUtils.planeImg,290,500,20,30,0,this);
    //创建boss对象
    public BossObj bossObj=null;

    //创建我方子弹对象



    //设置一个方法画出一个窗口
    public void launch(){
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(width,height);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("coder_z_飞机大战");
        //将所有要绘制的游戏物体全部添加到gameObjList中
        GameUtils.gameObjList.add(bgObj);
        GameUtils.gameObjList.add(planeObj);

        //当鼠标点击 “点击开始游戏”时 文字消失 立即进入游戏 此时的状态码变为1
        //添加鼠标点击事件
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //添加一个判断 判断游戏在未开始时，和鼠标左键点击时
                if(e.getButton()==1 && state==0){
                    state=1;
                    //调用repaint方法 重新改写启动页面 变为游戏开始了
                    repaint();

                }
            }
        });
        //暂停
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode()==32){
                    switch (state){
                        case 1: state=2;break;
                        case 2: state=1;break;
                        default:


                    }
                }
            }
        });

        //每25毫秒调用一次rapaint方法
        while(true){
            //如果游戏状态==1 那么执行creatobj方法 批量创建敌机和子弹
            if(state==1){
                creatObj();
                repaint();
            }

            try {
                Thread.sleep(25);
            } catch (Exception e) {
            e.printStackTrace();
            }
        }

    }
    //重写paint方法
    @Override
    public void paint(Graphics g) {
        if(offScreenImage==null){
            offScreenImage=createImage(width ,height);
        }
        Graphics gImage=offScreenImage.getGraphics();
        gImage.fillRect(0,0,width,height);
        //用画笔g绘制图片
        //游戏未开始时
        if(state==0){
            //未开始时 添加启动页面 背景图 boss图 爆炸图
            gImage.drawImage(GameUtils.bgImg,0,0,null);
            gImage.drawImage(GameUtils.bossImg,220,120,null);
            gImage.drawImage(GameUtils.explodeImg,270,350,null);
            GameUtils.drawWord(gImage,"点击开始游戏",Color.yellow,40,180,300);
            //设置颜色 字体 点击开始游戏位置
//            gImage.setColor(Color.yellow);
//            gImage.setFont(new Font("仿宋",Font.BOLD,40));
//            gImage.drawString("点击开始游戏",180,300);
        }
        //游戏开始了
        if(state==1){
            GameUtils.gameObjList.addAll(GameUtils.explodeObjList);
            //未开始时 添加启动页面 背景图 boss图 爆炸图 遍历gameobjlist
            for (int i = 0; i <GameUtils.gameObjList.size() ; i++) {
                GameUtils.gameObjList.get(i).paintSelf(gImage);
            }
            GameUtils.gameObjList.removeAll(GameUtils.removeList);

        }

        if(state==3){
            //敌我飞机碰撞，游戏失败

            gImage.drawImage(GameUtils.explodeImg,planeObj.getX()-35,planeObj.getY()-50,null);
            GameUtils.drawWord(gImage,"Game Over",Color.RED,50,180,300);
            //设置颜色 字体 点击开始游戏位置
//            gImage.setColor(Color.RED);
//            gImage.setFont(new Font("仿宋",Font.BOLD,50));
//            gImage.drawString("Game Over",180,300);
        }
        if(state==4){
            //通关
            gImage.drawImage(GameUtils.explodeImg,bossObj.getX()+30,bossObj.getY(),null);
            GameUtils.drawWord(gImage,"恭喜你通关了",Color.green,50,190,300);
        }
        //最后将新图片绘制到新窗口中
        GameUtils.drawWord((gImage),score+" 分",Color.green,40,30,100);
        g.drawImage(offScreenImage,0,0,null);
        count++;

    }
    //创建一个方法 用来批量创建子弹和敌机
    void creatObj(){
        //每调用15次paint方法才生产一颗子弹
        if(count%15==0){
            //通过匿名类的方法创建子弹和对象 我方子弹
            GameUtils.shellObjList.add(new ShellObj(GameUtils.shellImg,planeObj.getX()+3,planeObj.getY()-16,14,29,5,this));
            //获取shellobjlist里的最后一个元素
            GameUtils.gameObjList.add(GameUtils.shellObjList.get(GameUtils.shellObjList.size()-1));
        }
        //批量创建敌机
        if(count%15==0){
            //通过工具类获取敌方飞机
            GameUtils.enemyObjList.add(new EnemyObj(GameUtils.enemyImg,(int)(Math.random()*12)*50,0,49,36,5,this));
            //获取enemyobjlist里的最后一个元素
            GameUtils.gameObjList.add(GameUtils.enemyObjList.get(GameUtils.enemyObjList.size()-1));
            enemyCount++;
        }
        //为敌方飞机添加子弹
        if(count%15==0 &&bossObj != null){
            GameUtils.BulletObjList.add(new BulletObj(GameUtils.bulletImg, bossObj.getX()+76, bossObj.getY()+85,15,25,5,this)); //通过匿名类的方法创建子弹和对象 我方子弹
            GameUtils.gameObjList.add(GameUtils.BulletObjList.get(GameUtils.BulletObjList.size()-1));


        }
        if(enemyCount>1&&bossObj==null){
          bossObj=  new BossObj(GameUtils.bossImg,250,35,155,100,5,this);
            GameUtils.gameObjList.add(bossObj);
        }

    }
    public static void main(String[] args) {
        GameWin gameWin=new GameWin();
        gameWin.launch();


    }


}
